home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / tcp_ip / tnos / tnos100s / mboxcmd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-01-13  |  53.0 KB  |  2,081 lines

  1. /* NOTE: because of size, the previous 'mailbox.c' has been
  2.  * split in 2 parts:
  3.  * mboxcmd.c, containing the 'mbox' subcommands, and
  4.  * mailbox.c, containing the remote user mailbox commands
  5.  * 920325 - WG7J
  6.  */
  7. /* There are only two functions in this mailbox code that depend on the
  8.  * underlying protocol, namely mbx_getname() and dochat(). All the other
  9.  * functions can hopefully be used without modification on other stream
  10.  * oriented protocols than AX.25 or NET/ROM.
  11.  *
  12.  * SM0RGV 890506, most work done previously by W9NK
  13.  *
  14.  *** Changed 900114 by KA9Q to use newline mapping features in stream socket
  15.  *    interface code; everything here uses C eol convention (\n)
  16.  *
  17.  *    Numerous new commands and other changes by SM0RGV, 900120
  18.  *
  19.  * Gateway function now support outgoing connects with the user's call
  20.  * with inverted ssid. Users can connect to system alias as well...
  21.  * See also several mods in socket.c,ax25.c and others
  22.  * 11/15/91, WG7J/PA3DIS
  23.  *
  24.  * Userlogging, RM,VM and KM commands, and R:-line interpretation
  25.  * added 920307 and later, Johan. K. Reinalda, WG7J/PA3DIS
  26.  *
  27.  * Inactivity timeout-disconnect added 920325 and later - WG7J
  28.  *
  29.  */
  30. #include <stdio.h>
  31. #include <time.h>
  32. #include <ctype.h>
  33. #include <alloc.h>
  34. #include <stdlib.h>
  35. #include <string.h>
  36. #include <time.h>
  37. #ifdef  UNIX
  38. #include <sys/types.h>
  39. #include <sys/stat.h>
  40. #endif
  41. #include "global.h"
  42. #include "config.h"
  43. #include "timer.h"
  44. #include "proc.h"
  45. #include "socket.h"
  46. #include "usock.h"
  47. #include "session.h"
  48. #include "smtp.h"
  49. #include "dirutil.h"
  50. #include "telnet.h"
  51. #include "ftp.h"
  52. #include "ftpserv.h"
  53. #include "commands.h"
  54. #include "netuser.h"
  55. #include "files.h"
  56. #include "bm.h"
  57. #include "pktdrvr.h"
  58. #include "ax25.h"
  59. #include "mailbox.h"
  60. #include "ax25mail.h"
  61. #include "nr4mail.h"
  62. #include "cmdparse.h"
  63. #include "mailfor.h"
  64.  
  65. #ifdef MAILBOX
  66.  
  67. /*
  68. #define MBDEBUG
  69. */
  70.  
  71. extern char *mblookname __ARGS((struct mbx *m,char *str));
  72. extern int dombmovemail __ARGS((int argc,char *argv[],void *p));
  73. extern char *host_or_wpage_exp __ARGS((char *to,int hier,int exphome));
  74. extern char *wpage_exp __ARGS((char *to,int hier,int exphome));
  75. extern char *permtest __ARGS((char *path,long privs,char *name,int mode,char *root,int dir));
  76. extern int rdaemon __ARGS((FILE *data,char *from, char *to, char *msg, char msgtype, int mode));
  77. extern char *skipwhite __ARGS((char *));
  78. extern char *skipnonwhite __ARGS((char *));
  79.  
  80. extern char Myalias[];
  81. extern char MyBBS[AXALEN];
  82. extern char shortversion[];
  83. extern int ExpireActive;
  84. extern char *ExpireArea;
  85. extern time_t ExpireLast;
  86.  
  87. extern struct mbx *Mbox[NUMMBX];
  88. extern int BbsUsers;
  89. extern int Totallogins, Conflogins, Tutorlogins[], BBSlogins;
  90. char *MMotd;
  91. char *MExit;
  92. char *Mtmsg;
  93. char *MAttendedAt;
  94. int MAttended = 0;
  95. /* unsigned Maxlet = BM_NLET; */
  96. char Mbpasswd[MAXPWDLEN+1] = "";
  97. struct no_js *Exclude = (struct no_js *)NULL;
  98.  
  99. #ifdef MBFWD
  100. char *Mbzip = NULLCHAR;
  101. char *Mbqth = NULLCHAR;
  102. char *Mbhome = NULLCHAR;
  103. char *Mbhaddress = NULLCHAR;
  104. char *Mbfwdinfo = NULLCHAR;
  105. int Mbsmtptoo = 0;
  106. int Mtrace = 0;
  107. int Mbfullsvc = 1;
  108. extern unsigned subchannels[NUMMBX];
  109. extern int subchannelusage[NUMMBX];
  110. #endif
  111.  
  112. extern int MbSent;
  113. extern int MbRead;
  114. extern int MbRecvd;
  115. #ifdef MBFWD
  116. extern int MbForwarded;
  117. #endif
  118.  
  119. #ifdef AX25
  120. static char Uplink[] =     "Uplink   (%s)";
  121. static char Downlink[] =   "Downlink (%s)";
  122. #endif
  123. #ifdef NETROM
  124. static char incircuit[]  = "Circuit  (%s%s%s %s)";
  125. static char outcircuit[] = "Circuit  (%s%s%s)";
  126. #endif
  127. static char Telnet[] =     "Telnet   (%s @ %s)";
  128. static char Telnetdown[] = "Telnet   (%s)";
  129. static char Local[] =      "Local    (%s @ %s)";
  130.  
  131. static int dobbsdumperr __ARGS((int argc,char *argv[],void *p));
  132. static int doalias __ARGS((int argc,char *argv[],void *p));
  133. static int donewmotdfile __ARGS((int argc,char *argv[],void *p));
  134. static int doattend __ARGS((int argc,char *argv[],void *p));
  135. static int domaxmsg __ARGS((int argc,char *argv[],void *p));
  136. static int domotd __ARGS((int argc,char *argv[],void *p));
  137. static int domexit __ARGS((int argc,char *argv[],void *p));
  138. static int dotimeout __ARGS((int argc,char *argv[],void *p));
  139. static int dotipsecurity __ARGS((int argc,char *argv[],void *p));
  140. static int dombsubchannel __ARGS((int argc,char *argv[],void *p));
  141. int dombusers __ARGS((int argc,char *argv[],void *p));
  142. static int dombpast __ARGS((int argc,char *argv[],void *p));
  143. static int doarea __ARGS((int argc,char *argv[],void *p));
  144. static int dojumpstart __ARGS((int argc,char *argv[],void *p));
  145. static int dombnrid __ARGS((int argc,char *argv[],void *p));
  146. static int dombpasswd __ARGS((int argc,char *argv[],void *p));
  147. static int dombsecure __ARGS((int argc,char *argv[],void *p));
  148. static int dombtrace __ARGS((int argc,char *argv[],void *p));
  149. static int dombzipcode __ARGS((int argc,char *argv[],void *p));
  150. static int dombfwdinfo __ARGS((int argc,char *argv[],void *p));
  151. static int dombqth __ARGS((int argc,char *argv[],void *p));
  152. static int dombhome __ARGS((int argc,char *argv[],void *p));
  153. static int dombhaddress __ARGS((int argc,char *argv[],void *p));
  154. static int dombsmtptoo __ARGS((int argc,char *argv[],void *p));
  155. static int dombutc __ARGS((int argc,char *argv[],void *p));
  156. static int dombmport __ARGS((int argc,char *argv[],void *p));
  157. extern int dombmailfor __ARGS((int argc,char *argv[],void *p));
  158. extern int dombstatus __ARGS((int argc,char *argv[],void *p));
  159. int dombmailstats __ARGS((int argc,char *argv[],void *p));
  160. static int dombtdisc __ARGS((int argc,char *argv[],void *p));
  161. static int dombtmsg __ARGS((int argc,char *argv[],void *p));
  162. static int dombconvers __ARGS((int argc,char *argv[],void *p));
  163. static int dombremote __ARGS((int argc,char *argv[],void *p));
  164. static int dombsendquery __ARGS((int argc,char *argv[],void *p));
  165. static int dombbid __ARGS((int argc,char *argv[],void *p));
  166. static int dombfullsvc __ARGS((int argc,char *argv[],void *p));
  167. static int dombmid __ARGS((int argc,char *argv[],void *p));
  168. static int dombwpages __ARGS((int argc,char *argv[],void *p));
  169. static int dombrsample __ARGS((int argc,char *argv[],void *p));
  170. static int dombrstyle __ARGS((int argc,char *argv[],void *p));
  171. static int dobump __ARGS((int argc,char *argv[],void *p));
  172. static int dozap __ARGS((int argc,char *argv[],void *p));
  173. static int dombhideport __ARGS((int argc,char *argv[],void *p));
  174. static int dombnobid __ARGS((int argc,char *argv[],void *p));
  175. static int domblogging __ARGS((int argc,char *argv[],void *p));
  176. extern char *mbxtime __ARGS((char *line));
  177. extern void updateFwd __ARGS((char *who, char *area, long bid));
  178. extern void bbsbump __ARGS((char *user, int zap));
  179.  
  180.  
  181. int Mbjumpstart = 1;
  182. int Usenrid = 0;
  183. int NoBid;
  184. int MbBID = 0;
  185. int MbMID = 1;
  186. int MbRSTYLE = 0;
  187. int MbLogging = 0;
  188. #ifdef WPAGES
  189. int MbWpages = 1;
  190. #endif
  191. int MBSecure = 0;
  192. int Mbsendquery = 1;
  193. #ifdef MBXTDISC
  194. int32 Mbtdiscinit = 0;
  195. #endif
  196. #ifdef TIPMAIL
  197. int32 Mbtipperms = 0x109401;    /* no_slip, ftp_read, no_sendcmd, no_3party, no_convers */
  198. #endif
  199.  
  200. /* mbox subcommand table */
  201. static struct cmds DFAR Mbtab[] = {
  202.     "alias",    doalias,    0, 0, NULLCHAR,
  203.     "attend",    doattend,    0, 0, NULLCHAR,
  204.     "bid",        dombbid,    0, 0, NULLCHAR,
  205.     "bbsdumperr",    dobbsdumperr,    0, 0, NULLCHAR,
  206.     "bump",        dobump,        0, 0, NULLCHAR,
  207. #ifdef CONVERS
  208.     "convers",  dombconvers,0, 0, NULLCHAR,
  209. #endif
  210. #ifdef MBFWD
  211.     "fullservice", dombfullsvc,0,0, NULLCHAR,
  212.     "fwdinfo",  dombfwdinfo,0, 0, NULLCHAR,
  213.     "haddress", dombhaddress,0,0, NULLCHAR,
  214.     "hideport", dombhideport, 0,0, NULLCHAR,
  215.     "home",     dombhome, 0, 0, NULLCHAR,
  216. #endif
  217. #ifdef AX25
  218.     "jumpstart", dojumpstart,0, 0, NULLCHAR,
  219. #ifdef MBFWD
  220.     "kick",     dombkick,   0, 0, NULLCHAR,
  221. #endif
  222. #endif
  223.     "logging",    domblogging, 0, 0, NULLCHAR,
  224. #ifdef MAILFOR
  225. #ifdef AX25
  226.     "mailfor",  dombmailfor,0, 0, NULLCHAR,
  227. #endif
  228. #endif
  229. #ifdef notagain
  230.     "maxmsg",    domaxmsg,    0, 0, NULLCHAR,
  231. #endif
  232.     "mailstats",    dombmailstats,    0, 0, NULLCHAR,
  233.     "mexit",    domexit,    0, 0, NULLCHAR,
  234.     "mid",        dombmid,    0, 0, NULLCHAR,
  235.     "motd",        domotd,        0, 0, NULLCHAR,
  236. #ifdef AX25
  237.     "mport",    dombmport,    0, 0, NULLCHAR,
  238. #endif
  239.     "newmotdfile",    donewmotdfile,    0, 0, NULLCHAR,
  240.     "nobid",  dombnobid,  0, 0, NULLCHAR,
  241. #ifdef AX25
  242.     "nrid",     dombnrid,   0, 0, NULLCHAR,
  243. #endif
  244.     "past",     dombpast,   0, 0, NULLCHAR,
  245.     "password", dombpasswd, 0, 0, NULLCHAR,
  246.     "remote",   dombremote, 0, 0, NULLCHAR,
  247.     "rsample",    dombrsample,0, 0, NULLCHAR,
  248.     "rstyle",    dombrstyle, 0, 0, NULLCHAR,
  249. #ifdef MBFWD
  250.     "qth",      dombqth,    0, 0, NULLCHAR,
  251. #endif
  252.     "secure",   dombsecure, 0, 0, NULLCHAR,
  253.     "sendquery",dombsendquery,0,0,NULLCHAR,
  254. #ifdef MBFWD
  255.     "smtptoo",  dombsmtptoo,0, 0, NULLCHAR,
  256. #endif
  257.     "status",   dombstatus,  0, 0, NULLCHAR,
  258. #ifdef  AX25
  259. #ifdef MBFWD
  260.     "subchannel",    dombsubchannel,    0, 0, NULLCHAR,
  261.     "timer",    dombtimer,    0, 0, NULLCHAR,
  262. #endif
  263. #endif
  264. #ifdef MBXTDISC
  265.     "tdisc",    dombtdisc,  0, 0, NULLCHAR,
  266. #endif
  267. #ifdef TIPMAIL
  268. #ifdef ALLSERV
  269.     "tipsecurity", dotipsecurity, 0, 0, NULLCHAR,
  270.     "tiptimeout",   dotimeout,  0, 0, NULLCHAR,
  271. #endif
  272. #endif
  273.     "tmsg",     dombtmsg,   0, 0, NULLCHAR,
  274. #ifdef MBFWD
  275.     "trace",    dombtrace,  0, 0, NULLCHAR,
  276.     "utc",      dombutc,    0, 0, NULLCHAR,
  277. #ifdef WPAGES
  278.     "wpages",    dombwpages, 0, 0, NULLCHAR,
  279. #endif
  280.     "zap",    dozap,        0, 0, NULLCHAR,
  281.     "zipcode",  dombzipcode,0, 0, NULLCHAR,
  282. #endif
  283.     NULLCHAR,
  284. };
  285.  
  286. char Mbnrid[20];
  287.  
  288. /*set the mailbox netrom id*/
  289. void
  290. setmbnrid() {
  291.     char tmp[AXBUF];
  292. #ifdef NETROM
  293.     char tmp2[AXBUF];
  294. #endif
  295. #ifndef AX25
  296.     char *cp;
  297. #endif
  298.  
  299. #ifdef NETROM
  300.     if(Nr_iface != NULLIF) { /* Use netrom call, and alias (if exists) */
  301.         if(*Myalias != '\0')
  302.             sprintf(Mbnrid,"%s:%s ",pax25(tmp,Myalias),
  303.                     pax25(tmp2,Nr_iface->hwaddr));
  304.         else
  305.             sprintf(Mbnrid,"%s ",pax25(tmp,Nr_iface->hwaddr));
  306.         return;
  307.     }
  308.     /* Use Mycall, and alias (if exists) */
  309.     if(*Myalias != '\0')
  310.         sprintf(Mbnrid,"%s:%s ",pax25(tmp,Myalias),pax25(tmp2,Mycall));
  311.     else
  312. #endif
  313. #ifdef AX25
  314.         sprintf(Mbnrid,"%s ",pax25(tmp,Mycall));
  315. #else
  316.         strncpy(Mbnrid,Hostname,19);
  317.         if((cp = strchr(Mbnrid,'.')) != NULLCHAR)
  318.             *cp = '\0';
  319. #endif
  320.     return;
  321. }
  322.  
  323. /*This is a dummy called from the main command interpreter,
  324.  *setup a mbx structure so dombusers() works correct - WG7J
  325.  */
  326. int
  327. dombstatus(argc,argv,p)
  328. int argc;
  329. char *argv[];
  330. void *p;
  331. {
  332.     struct mbx m;
  333.  
  334.     m.privs = SYSOP_CMD;
  335.     m.stype = ' ';
  336.     return dombusers(0,NULL,&m);
  337. }
  338.  
  339. static int
  340. dobump(argc,argv,p)
  341. int argc;
  342. char *argv[];
  343. void *p;
  344. {
  345.     if (argc == 1)
  346.         tprintf ("Syntax: mbox bump username\n");
  347.     else
  348.         bbsbump (argv[1], 0);
  349.     return 0;
  350. }
  351.  
  352. static int
  353. dozap(argc,argv,p)
  354. int argc;
  355. char *argv[];
  356. void *p;
  357. {
  358.     if (argc == 1)
  359.         tprintf ("Syntax: mbox zap username\n");
  360.     else
  361.         bbsbump (argv[1], 1);
  362.     return 0;
  363. }
  364.  
  365. int
  366. dombrsample(argc,argv,p)
  367. int argc;
  368. char *argv[];
  369. void *p;
  370. {
  371. time_t t;
  372. char *cp, buf[40], thetime[100];
  373.  
  374.     time(&t);
  375.     pax25(buf,Mycall);
  376.     if((cp = strchr(buf,'-')) != NULLCHAR)
  377.         *cp = '\0'; /* remove SSID */
  378.     strcpy(thetime, ptime(&t));
  379.     if (!MbRSTYLE)    {
  380.         tprintf("R:%s @:%s%s%s ", mbxtime(thetime), buf, (Mbhaddress) ? "." : "",
  381.             (Mbhaddress) ? Mbhaddress : "");
  382.         if (Mbfwdinfo)
  383.             tprintf("[%s] ", Mbfwdinfo);
  384.         if (Mbqth)
  385.             tprintf("%s ", Mbqth);
  386.         if (MbMID)
  387.             tprintf("#:7388 ");
  388.         if (Mbzip)
  389.             tprintf("Z:%s ", Mbzip);
  390.         if (MbBID)    {
  391.             strncpy (buf, Hostname, 40);
  392.             strupr (buf);
  393.             if((cp = strchr(buf,'.')) != NULLCHAR)
  394.                 *cp = '\0';
  395.             tprintf("$:7388_%s", buf);
  396.         }
  397.     } else
  398.         tprintf("R:%s 7388@%s%s%s", mbxtime(thetime), buf, (Mbhaddress) ? "." : "",
  399.             (Mbhaddress) ? Mbhaddress : "");
  400.     tprintf("\n");
  401.     return 0;
  402. }
  403.  
  404.  
  405. int
  406. dombrstyle(argc,argv,p)
  407. int argc;
  408. char *argv[];
  409. void *p;
  410. {
  411.     return setbool(&MbRSTYLE,"W0RLI style R: lines",argc,argv);
  412. }
  413.  
  414.  
  415. int
  416. domblogging(argc,argv,p)
  417. int argc;
  418. char *argv[];
  419. void *p;
  420. {
  421.     return setbool(&MbLogging,"Keep log of each MBOX login",argc,argv);
  422. }
  423.  
  424.  
  425. int
  426. dombox(argc,argv,p)
  427. int argc;
  428. char *argv[];
  429. void *p;
  430. {
  431.     if(argc == 1)
  432.         return dombstatus(0,NULL,NULL);
  433.     return subcmd(Mbtab,argc,argv,p);
  434. }
  435.  
  436. #ifdef AX25
  437.  
  438. static int
  439. dombhideport(argc, argv,p)
  440. int argc;
  441. char *argv[];
  442. void *p;
  443. {
  444.     return(dosetflag(argc,argv,p,HIDE_PORT, 1));
  445. }
  446.  
  447. static int
  448. dojumpstart(argc,argv,p)
  449. int argc;
  450. char *argv[];
  451. void *p;
  452. {
  453.     register int i;
  454.     char tmp[AXBUF];
  455.     struct no_js *ep;
  456.  
  457.     if(*argv[1] == 'e') {
  458.         /*the exclude subcommand*/
  459.         if(argc == 2) { /*just list them*/
  460.             for(ep=Exclude;ep!=(struct no_js *)NULL;ep=ep->next)
  461.                 tprintf("%s ",pax25(tmp,ep->call));
  462.             tputc('\n');
  463.         } else { /*add some call(s)*/
  464.             for(i=0;i<argc-2;i++) {
  465.                 ep = callocw(1,sizeof(struct no_js));
  466.                 if(setcall(ep->call,argv[i+2]) == -1){
  467.                     tprintf("Invalid call: %s\n",argv[i+2]);
  468.                     free(ep);
  469.                 } else { /* add to list */
  470.                     ep->next = Exclude;
  471.                     Exclude = ep;
  472.                 }
  473.             }
  474.         }
  475.         return 0;
  476.     }
  477.     return setbool(&Mbjumpstart,"Jump start on connect",argc,argv);
  478. }
  479.  
  480. static int
  481. dombnrid(argc,argv,p)
  482. int argc;
  483. char *argv[];
  484. void *p;
  485. {
  486.     return setbool(&Usenrid,"Netrom id prompt",argc,argv);
  487. }
  488.  
  489.  
  490. static int
  491. dombmport(argc,argv,p)
  492. int argc;
  493. char *argv[];
  494. void *p;
  495. {
  496.     return(dosetflag(argc,argv,p,MAIL_BEACON, 1));
  497. }
  498.  
  499. #endif /* AX25 */
  500.  
  501.  
  502. static int
  503. dombfullsvc(argc,argv,p)
  504. int argc;
  505. char *argv[];
  506. void *p;
  507. {
  508.     return setbool(&Mbfullsvc,"Full Service BBS",argc,argv);
  509. }
  510.  
  511. static int
  512. dombbid(argc,argv,p)
  513. int argc;
  514. char *argv[];
  515. void *p;
  516. {
  517.     return setbool(&MbBID,"Original BID in R: lines",argc,argv);
  518. }
  519.  
  520. static int
  521. dombmid(argc,argv,p)
  522. int argc;
  523. char *argv[];
  524. void *p;
  525. {
  526.     return setbool(&MbMID,"Local MID in R: lines",argc,argv);
  527. }
  528.  
  529. #ifdef WPAGES
  530. static int
  531. dombwpages(argc,argv,p)
  532. int argc;
  533. char *argv[];
  534. void *p;
  535. {
  536.     return setbool(&MbWpages,"Use White Pages dbase",argc,argv);
  537. }
  538. #endif
  539.  
  540. static int
  541. dombnobid(argc,argv,p)
  542. int argc;
  543. char *argv[];
  544. void *p;
  545. {
  546.     return setbool(&NoBid,"Accept Buls without BID",argc,argv);
  547. }
  548.  
  549. static int
  550. dombsendquery(argc,argv,p)
  551. int argc;
  552. char *argv[];
  553. void *p;
  554. {
  555.     return setbool(&Mbsendquery,"query after send",argc,argv);
  556. }
  557.  
  558. #ifdef CONVERS
  559. int Mbconverse = 1;
  560.  
  561. static int
  562. dombconvers(argc,argv,p)
  563. int argc;
  564. char *argv[];
  565. void *p;
  566. {
  567.     return setbool(&Mbconverse,"Mbox convers",argc,argv);
  568. }
  569. #endif
  570.  
  571. int BBSdump = 1;
  572.  
  573. static int
  574. dobbsdumperr(argc,argv,p)
  575. int argc;
  576. char *argv[];
  577. void *p;
  578. {
  579.     return setbool(&BBSdump,"BBS - Dump on error",argc,argv);
  580. }
  581.  
  582. /* if unattended mode is set, ax25, telnet and maybe other sessions will
  583.  * be restricted.
  584.  */
  585. static int
  586. doattend(argc,argv,p)
  587. int argc;
  588. char *argv[];
  589. void *p;
  590. {
  591.     return setbool(&MAttended,"Mailbox Attended flag",argc,argv);
  592. }
  593.  
  594. #ifdef notagain
  595. static int
  596. domaxmsg(argc,argv,p)
  597. int argc;
  598. char *argv[];
  599. void *p;
  600. {
  601.     return setuns(&Maxlet,"Maximum messages per area",argc,argv);
  602. }
  603. #endif
  604.  
  605. #ifdef MBXTDISC
  606. /* Set mailbox redundancy timer */
  607. static
  608. dombtdisc(argc,argv,p)
  609. int argc;
  610. char *argv[];
  611. void *p;
  612. {
  613.     return setlong(&Mbtdiscinit,"Mbox redundancy timer (sec)",argc,argv);
  614. }
  615. #endif
  616.  
  617. #ifdef MBFWD
  618. static int
  619. dombsmtptoo(argc,argv,p)
  620. int argc;
  621. char *argv[];
  622. void *p;
  623. {
  624.     return setbool(&Mbsmtptoo,"Bbs forwards SMTP headers",argc,argv);
  625. }
  626. #endif
  627.  
  628. static int
  629. dombpasswd(argc,argv,p)
  630. int argc;
  631. char *argv[];
  632. void *p;
  633. {
  634.     int len;
  635.  
  636.     /*Only allowed from keyboard*/
  637.     if(Curproc->input != Command->input) {
  638.         tputs(Noperm);
  639.         return 0;
  640.     }
  641.     if(argc != 2) {
  642.         tputs("Usage: mbox password \"<sysop password>\"\n");
  643.         return 0;
  644.     }
  645.     if((len=strlen(argv[1])) == 0)
  646.         return 0;       /* zero length, don't reset */
  647.  
  648.     if(len > MAXPWDLEN) {
  649.         tputs("Too long\n");
  650.         return 0;
  651.     }
  652.     strcpy(Mbpasswd,argv[1]);
  653.     return 0;
  654. }
  655.  
  656. /* define the BBS alias*/
  657. static int
  658. doalias(argc,argv,p)
  659. int argc ;
  660. char *argv[] ;
  661. void *p;
  662. {
  663.     int len;
  664.     char tmp[AXBUF];
  665.  
  666.     if(argc < 2) {
  667.         tprintf("%s\n",pax25(tmp,MyBBS));
  668.         return 0;
  669.     }
  670.     if(setcall(MyBBS,argv[1]) == -1)    {
  671.         tputs("can't set BBS alias\n");
  672.         return 0;
  673.     }
  674.     return 0;
  675. }
  676.  
  677. static int
  678. dostr(argc,argv,label,str)
  679. int argc;
  680. char *argv[];
  681. char *label, **str;
  682. {
  683.     if(argc > 2) {
  684.             tprintf ("Usage: mbox %s \"<your message>\"\n", label);
  685.         return 0;
  686.     }
  687.  
  688.     if(argc < 2) {
  689.         if(*str != NULLCHAR)
  690.             tputs(*str);
  691.     }
  692.     else {
  693.         if(*str != NULLCHAR){
  694.             free(*str);
  695.             *str = NULLCHAR;    /* reset the pointer */
  696.         }
  697.         if(!strlen(argv[1]))
  698.             return 0;        /* clearing the buffer */
  699.         *str = mallocw(strlen(argv[1])+5);/* allow for the EOL char */
  700.         strcpy(*str, argv[1]);
  701.         strcat(*str, "\n");        /* add the EOL char */
  702.     }
  703.     return 0;
  704. }
  705.  
  706. static int
  707. domotd(argc,argv,p)
  708. int argc;
  709. char *argv[];
  710. void *p;
  711. {
  712.     return dostr (argc,argv,"motd",&MMotd);
  713. }
  714.  
  715. static int
  716. dombremote(argc,argv,p)
  717. int argc;
  718. char *argv[];
  719. void *p;
  720. {
  721.     return dostr (argc,argv,"remote",&MAttendedAt);
  722. }
  723.  
  724.  
  725. static int
  726. donewmotdfile(argc,argv,p)
  727. int argc;
  728. char *argv[];
  729. void *p;
  730. {
  731. FILE *Ufile, *tfile;
  732. char buf[256], *cp;
  733.  
  734.     /* Save old defaults file to backup */
  735.     unlink(UDefbak);
  736.     if(rename(UDefaults,UDefbak))
  737.         return 0;
  738.         if ((tfile = fopen(UDefbak,"r")) != NULLFILE) {
  739.             if ((Ufile = fopen(UDefaults,"w")) == NULLFILE)      {
  740.                 fclose (tfile);
  741.                 return 0;
  742.             }
  743.                    while(fgets(buf,sizeof(buf),tfile) != NULLCHAR)    {
  744.                 if((cp=strchr(buf,' ')) != NULLCHAR)
  745.                     if((cp=strchr(buf,' ')) != NULLCHAR)
  746.                 if ((cp=strchr(cp,'R')) != NULLCHAR)
  747.                                *cp = ' ';
  748.             fputs(buf,Ufile);
  749.                    }
  750.                    fclose(tfile);
  751.                    fclose(Ufile);
  752.             tputs ("All users will view the 'motd' file on their next login!\n");
  753.         } else
  754.             rename(UDefbak,UDefaults);
  755.     return 0;
  756. }
  757.  
  758. static int
  759. domexit(argc,argv,p)
  760. int argc;
  761. char *argv[];
  762. void *p;
  763. {
  764.     return dostr (argc,argv,"mexit",&MExit);
  765. }
  766.  
  767. static int
  768. dombtmsg(argc,argv,p)
  769. int argc;
  770. char *argv[];
  771. void *p;
  772. {
  773.     return dostr (argc,argv,"tmsgs",&Mtmsg);
  774. }
  775.  
  776. #ifdef MBFWD
  777. int UtcOffset=0;
  778.  
  779. /*Set the difference between Local time, and UTC !*/
  780. static int
  781. dombutc(argc,argv,p)
  782. int argc;
  783. char *argv[];
  784. void *p;
  785. {
  786.     if(argc < 2) {
  787.         tputs("Local Time is UTC");
  788.         if(UtcOffset == 0)
  789.             tputc('\n');
  790.         else {
  791.             if(UtcOffset > 0)
  792.                 tputc('+');
  793.             tprintf("%d\n",UtcOffset);
  794.         }
  795.         return 0;
  796.     }
  797.     UtcOffset = atoi(argv[1]);
  798.     return 0;
  799. }
  800.  
  801. /*Set the ZIP to be used in the R: line when forwarding */
  802. static int
  803. dombzipcode(argc,argv,p)
  804. int argc;
  805. char *argv[];
  806. void *p;
  807. {
  808.     int len;
  809.  
  810.     if(argc > 2) {
  811.         tputs("Usage: mbox zipcode <your zip>\n");
  812.         return 0;
  813.     }
  814.  
  815.     if(argc < 2) {
  816.         if(Mbzip != NULLCHAR)
  817.             tprintf("%s\n",Mbzip);
  818.     }
  819.     else {
  820.         len = strlen(argv[1]);
  821. #ifdef notdef
  822.         /*check for a valid zip - this is for USA only!!! - WG7J*/
  823.         if( (len != 5) || !(atol(argv[1])) ){
  824.             tprintf("%s: Invalid, should be 5 digits!\n",argv[1]);
  825.             return 0;
  826.         }
  827. #endif
  828.         if(Mbzip != NULLCHAR){
  829.             free(Mbzip);
  830.             Mbzip = NULLCHAR;   /* reset the pointer */
  831.         }
  832.         if(len == 0)
  833.             return 0;        /* clearing the buffer */
  834.         Mbzip = mallocw(len+1); /* room for \0 */
  835.         strcpy(Mbzip, argv[1]);
  836.     }
  837.     return 0;
  838. }
  839.  
  840. /* Set the QTH to be used in R: line when forwarding*/
  841. static int
  842. dombqth(argc,argv,p)
  843. int argc;
  844. char *argv[];
  845. void *p;
  846. {
  847.     if(argc > 2) {
  848.         tputs("Usage: mbox qth <your qth> || \"<your qth, state>\"\n");
  849.         return 0;
  850.     }
  851.  
  852.     if(argc < 2) {
  853.         if(Mbqth != NULLCHAR)
  854.             tprintf("%s\n",Mbqth);
  855.     }
  856.     else {
  857.         if(Mbqth != NULLCHAR){
  858.             free(Mbqth);
  859.             Mbqth = NULLCHAR;   /* reset the pointer */
  860.         }
  861.         if(!strlen(argv[1]))
  862.             return 0;        /* clearing the buffer */
  863.         Mbqth = mallocw(strlen(argv[1]) + 1);
  864.         strcpy(Mbqth, argv[1]);
  865.     }
  866.     return 0;
  867. }
  868.  
  869. /* Set the HOME BBS prompt string to be used */
  870. static int
  871. dombhome(argc,argv,p)
  872. int argc;
  873. char *argv[];
  874. void *p;
  875. {
  876.     if(argc > 2) {
  877.             tputs("Usage: mbox home <your prompt string>\n");
  878.         return 0;
  879.     }
  880.  
  881.     if(argc < 2) {
  882.             if(Mbhome != NULLCHAR)
  883.             tprintf("%s\n",Mbhome);
  884.     }
  885.     else {
  886.         if(Mbhome != NULLCHAR){
  887.             free(Mbhome);
  888.             Mbhome = NULLCHAR;   /* reset the pointer */
  889.         }
  890.         if(!strlen(argv[1]))
  891.             return 0;        /* clearing the buffer */
  892.         Mbhome = mallocw(strlen(argv[1]) + 1);
  893.         strcpy(Mbhome, argv[1]);
  894.     }
  895.     return 0;
  896. }
  897.  
  898. /*Set the hierachical address to be used in R: line when forwarding*/
  899. static int
  900. dombhaddress(argc,argv,p)
  901. int argc;
  902. char *argv[];
  903. void *p;
  904. {
  905.     if(argc > 2) {
  906.         tputs("Usage: mbox haddress <your H-address (without call)>\n");
  907.         return 0;
  908.     }
  909.  
  910.     if(argc < 2) {
  911.         if(Mbhaddress != NULLCHAR)
  912.             tprintf("%s\n",Mbhaddress);
  913.     }
  914.     else {
  915.         if(Mbhaddress != NULLCHAR){
  916.             free(Mbhaddress);
  917.             Mbhaddress = NULLCHAR;   /* reset the pointer */
  918.         }
  919.         if(!strlen(argv[1]))
  920.             return 0;        /* clearing the buffer */
  921.         Mbhaddress = mallocw(strlen(argv[1]) + 1);
  922.         strcpy(Mbhaddress, argv[1]);
  923.         /*make sure the're upper case*/
  924.         strupr(Mbhaddress);
  925.     }
  926.     return 0;
  927. }
  928.  
  929. /*Set the R: line [info] to be used when forwarding*/
  930. static int
  931. dombfwdinfo(argc,argv,p)
  932. int argc;
  933. char *argv[];
  934. void *p;
  935. {
  936.     if(argc > 2) {
  937.         tputs("Usage: mbox fwdinfo \"<your R:-line [info]>\"\n");
  938.         return 0;
  939.     }
  940.  
  941.     if(argc < 2) {
  942.         if(Mbfwdinfo != NULLCHAR)
  943.             tprintf("%s\n",Mbfwdinfo);
  944.     }
  945.     else {
  946.         if(Mbfwdinfo != NULLCHAR){
  947.             free(Mbfwdinfo);
  948.             Mbfwdinfo = NULLCHAR;   /* reset the pointer */
  949.         }
  950.         if(!strlen(argv[1]))
  951.             return 0;        /* clearing the buffer */
  952.         Mbfwdinfo = mallocw(strlen(argv[1]) + 1);
  953.         strcpy(Mbfwdinfo, argv[1]);
  954.     }
  955.     return 0;
  956. }
  957. #endif /*MBFWD*/
  958.  
  959. /* Keep track of all past users */
  960. struct pu {
  961.     struct pu *next;    /* next one in list */
  962.     char name[20];              /* user name */
  963. #ifdef notdef
  964.     int family;                 /* how did user come in last */
  965. #endif
  966.     int32 time;                 /* When was the last login ? */
  967.     int number;                 /* Number of times logged in */
  968. };
  969. #define NULLPU (struct pu *)NULL
  970. struct pu *Pu = NULLPU;
  971.  
  972. /* Look up an entry in the users-list*/
  973. struct pu *
  974. pu_lookup(name)
  975. char *name;
  976. {
  977.     register struct pu *ppu;
  978.     struct pu *pulast = NULLPU;
  979.  
  980.     for(ppu = Pu;ppu != NULLPU;pulast = ppu,ppu = ppu->next){
  981.         if(!strcmp(name,ppu->name)){ /* found it! */
  982.             if(pulast != NULLPU){
  983.                 /* Move entry to top of list */
  984.                 pulast->next = ppu->next;
  985.                 ppu->next = Pu;
  986.                 Pu = ppu;
  987.             }
  988.             return ppu;
  989.         }
  990.     }
  991.     return NULLPU;
  992. }
  993.  
  994. /*Log all users of the mailbox*/
  995. /* This gets kept track of in the file name UDefaults */
  996. /* format is
  997. user @home (realname) datestamp options
  998. where options are separated by spaces
  999. M# - use more with # lines
  1000. A - use area indiation
  1001. X - use expert status
  1002. N - use netrom lookalike prompt
  1003. R - has the motd file been read?
  1004. S - give new message statistics on login
  1005. L - use LZW compressed streams
  1006. Cx - Connection type x (A=AX.25, N=NET/ROM, T=TELNET)
  1007. */
  1008.  
  1009. #ifdef USERLOG
  1010.  
  1011. /* Write the new defaults - WG7J */
  1012. void
  1013. updatedefaults(m, homeonly)
  1014. struct mbx *m;
  1015. int homeonly;
  1016. {
  1017. FILE *Ufile, *Lfile, *tfile;
  1018. char buf[256];
  1019. char *cp, *cp2;
  1020. time_t t;
  1021.  
  1022.     /* Save old defaults file to backup */
  1023.     unlink(UDefbak);
  1024.     if(rename(UDefaults,UDefbak))
  1025.         return;
  1026.  
  1027.     /*Write all users back, but update this one!*/
  1028.     if((Ufile = fopen(UDefaults,"w")) == NULLFILE)    {
  1029.         /* Can't create defaults file ???*/
  1030.         rename(UDefbak,UDefaults);
  1031.         return;
  1032.     }
  1033.  
  1034.     if((tfile = fopen(UDefbak,"r")) == NULLFILE) {
  1035.         /* What on earth happened ???? */
  1036.         fclose(Ufile);
  1037.         return;
  1038.     }
  1039.     while(fgets(buf,sizeof(buf),tfile) != NULLCHAR) {
  1040.         if((cp=strchr(buf,' ')) != NULLCHAR)
  1041.             *cp = '\0';
  1042.         if(!stricmp(m->name,buf)) {
  1043.             /*found this user*/
  1044.             time(&t);
  1045.             if (homeonly == 1)    {
  1046.             cp = strchr(++cp,' ');
  1047.         cp++;
  1048.         if (*cp == '@')        {
  1049.                 cp = strchr(++cp,' ');
  1050.             cp++;
  1051.         }
  1052.             cp = strdup (cp);
  1053.             sprintf (buf, "%s %s %s", m->name, m->home, cp);
  1054.             free (cp);
  1055.             } else if (homeonly == 2)    {
  1056.                 *cp = ' ';
  1057.             cp = strchr(++cp,' ');
  1058.         *cp++ = 0;
  1059.         if (*cp == '(')    {
  1060.                 cp = strchr(++cp,')');
  1061.             cp += 2;
  1062.         }
  1063.             cp = strdup (cp);
  1064.             cp2 = strdup (buf);
  1065.             sprintf (buf, "%s (%s) %s", cp2, m->realname, cp);
  1066.             free (cp);
  1067.             free (cp2);
  1068.             } else
  1069.                 sprintf(buf,"%s @%s %s %lu M%d %c %c %c %c %c %c %c C%c\n",
  1070.                         m->name,
  1071.                 (m->home && strnicmp (m->home, Hostname, strlen(m->home)))
  1072.                  ? m->home : "",
  1073.                 (m->realname) ? m->realname : "()",
  1074.                 t,m->morerows,
  1075.                         (m->sid&MBX_AREA) ? 'A' : ' ' ,
  1076.                         (m->sid&MBX_EXPERT) ? 'X' : ' ' ,
  1077.                         (m->sid&MBX_NRID) ? 'N' : ' ',
  1078.                         (m->sid&MBX_RDMOTD) ? 'R' : ' ',
  1079.                         (m->sid&MBX_STATS) ? 'S' : ' ',
  1080.                         (m->sid&MBX_TNOS) ? 'L' : ' ',
  1081.                         (m->sid&MBX_GFX) ? 'G' : ' ',
  1082.                         (m->family == AF_AX25) ? 'A' : \
  1083.                         ((m->family == AF_NETROM) ? 'N' : 'T'));    
  1084.         } else
  1085.             *cp = ' '; /* restore the space !*/
  1086.         fputs(buf,Ufile);
  1087.     }
  1088.     fclose(tfile);
  1089.     fclose(Ufile);
  1090.     return;
  1091. }
  1092. #endif /* USERLOG */
  1093.  
  1094.  
  1095. char DFAR *
  1096. findhome (name)
  1097. char *name;
  1098. {
  1099. char buf[256];
  1100. register char *cp, *cp2;
  1101. char DFAR *retval = (char DFAR *)0;
  1102. register FILE *Ufile;
  1103.  
  1104.     if((Ufile = fopen(UDefaults,"r")) != NULLFILE)        {
  1105.         while(fgets(buf,sizeof(buf),Ufile) != NULLCHAR)        {
  1106.             if((cp=strchr(buf,' ')) != NULLCHAR)
  1107.                 *cp++ = '\0';
  1108.             if(!stricmp(name,buf))    {
  1109.                 if((cp2=strchr(cp,' ')) != NULLCHAR)
  1110.                     *cp2 = '\0';
  1111.                 if (*cp == '@')        {
  1112.                     cp++;
  1113.                     if (!*cp)
  1114.                         retval = (char DFAR *) -1;    /* -1 means home is here */
  1115.                     else if (*cp != '-')
  1116.                         retval = (char DFAR *) strdup (cp);
  1117.                 }
  1118.                 break;
  1119.             }
  1120.         }
  1121.         fclose (Ufile);
  1122.     }
  1123.     return (retval);
  1124. }
  1125.  
  1126.  
  1127. void askhome (m, initial)
  1128. struct mbx *m;
  1129. int initial;
  1130. {
  1131. #ifdef ASKHOME
  1132. char *cp;
  1133. char name[80];
  1134.  
  1135.     if (initial && m->privs & IS_BBS)    {
  1136.         m->home = strdup (m->name);
  1137.         m->morerows = 0;
  1138.         return;
  1139.     }
  1140.     if (initial)    {
  1141.         tputs ("\nSorry to have to ask, but this system does not know your HOME BBS!\n");
  1142.         tputs ("This information is needed in order to properly send any mail to you from\nusers of this system\n\n");
  1143.         tputs ("Your HOME BBS is like your Postal Address. If you have already defined your\n");
  1144.         tputs ("HOME BBS on another system, the name of that system is needed.\n");
  1145.         tputs ("\nNOTE: only use a BBS hierarchial address, not a TCP/IP address.\n");
  1146.         if (Mbhome != NULLCHAR)
  1147.             tputs (Mbhome);
  1148.         strcpy (name, Hostname);
  1149.         if((cp=strchr(name,'.')) != NULLCHAR)
  1150.             *cp = '\0';
  1151.         m->home = strdup (name);
  1152.     } else
  1153.         tprintf ("\nChanging HOME BBS from '%s'! Enter name of new HOME...\n",
  1154.             (m->home) ? m->home : Hostname);
  1155.     tputs ("\nHOME BBS>\n");
  1156.     if (mbxrecvline(m) == -1)
  1157.         return;
  1158.     for (cp = m->line; isspace(*cp); ++cp)
  1159.         ;
  1160.     if (*cp && *cp != '\n')        {
  1161.         free (m->home);
  1162.         strlwr (cp);
  1163.         m->home = strdup (cp);
  1164.     }
  1165.     tprintf ("\nHOME BBS set to '%s'\n", (m->home) ? m->home: Hostname);
  1166. /*    if (!initial)    */
  1167.         m->update = 1;
  1168. #endif
  1169. }
  1170.  
  1171.  
  1172.  
  1173. int
  1174. dobbshome(argc,argv,p)
  1175. int argc;
  1176. char *argv[];
  1177. void *p;
  1178. {
  1179. struct mbx *m;
  1180. char *orgname, *orghome;
  1181.  
  1182.     m = (struct mbx *)p;
  1183.     if (argc > 1 && (m->privs & SYSOP_CMD))    {
  1184.         if (argc == 2)
  1185.             return (dombuserinfo (argc, argv, p));
  1186.         if (argc > 3 || argv[2][0] != '@')    {
  1187.             tputs ("Syntax: HOME user @bbs\n");
  1188.             return (0);
  1189.         }
  1190.         orgname = strdup (m->name);
  1191.         orghome = m->home;
  1192.         strcpy (m->name,argv[1]);
  1193.         m->home = argv[2];
  1194.         updatedefaults (m, 1);
  1195.         strcpy (m->name, orgname);
  1196.         m->home = orghome;
  1197.         free (orgname);
  1198.     } else
  1199.         askhome (m, 0);
  1200.     return 0;
  1201. }
  1202.  
  1203.  
  1204.  
  1205. void askrealname (m, initial)
  1206. struct mbx *m;
  1207. int initial;
  1208. {
  1209. char *cp;
  1210. char name[80];
  1211. char *callnm;
  1212.  
  1213.     if (initial)    {
  1214.         callnm = mblookname (NULLMBX, m->name);
  1215.         if (m->privs & IS_BBS)    {
  1216.             m->realname = strdup (m->name);
  1217.             m->morerows = 0;
  1218.             return;
  1219.         }
  1220.         if (callnm)    {
  1221.             m->realname = strdup (&callnm[1]);
  1222.             free (callnm);
  1223.             m->update = 1;
  1224.             tprintf ("\nThe on-line callbook shows your real name as '%s'\n", callnm);
  1225.         } else    {
  1226.             m->realname = strdup ("()");
  1227. /*            tprintf ("\nThe on-line callbook could not find your real name\n");    */
  1228.         }
  1229.         tputs ("Your real name is used along with your callsign when sending a message\n");
  1230.         tprintf ("If you wish to %s this, use the NAME command\n", (callnm) ? "change" : "set");
  1231.         return;
  1232.     }
  1233.     tprintf ("\nChanging REAL NAME from '%s'!\nEnter the name you wish to be known by...\n",
  1234.         (!m->realname || !strcmp (m->realname, "()")) ? "unknown" : m->realname);
  1235.     tputs ("\nREAL NAME>\n");
  1236.     if (mbxrecvline(m) == -1)
  1237.         return;
  1238.     cp = skipwhite (m->line);
  1239.     if (*cp && *cp != '\n')        {
  1240.         free (m->realname);
  1241.         sprintf (name, "(%s)", cp);
  1242.         m->realname = strdup (name);
  1243.     }
  1244.     tprintf ("\nREAL NAME set to '%s'\n", (m->realname && strcmp(m->realname, "()")) ? m->realname: "unknown");
  1245.     m->update = 1;
  1246. }
  1247.  
  1248.  
  1249.  
  1250. int
  1251. dorealname(argc,argv,p)
  1252. int argc;
  1253. char *argv[];
  1254. void *p;
  1255. {
  1256. struct mbx *m;
  1257. char *orgname, *orgreal;
  1258.  
  1259.     m = (struct mbx *)p;
  1260.     if (argc > 1 && (m->privs & SYSOP_CMD))    {
  1261.         if (argc == 2)
  1262.             return (dombuserinfo (argc, argv, p));
  1263.         if (argc > 3)    {
  1264.             tputs ("Syntax: NAME user \"realname\"\n");
  1265.             return (0);
  1266.         }
  1267.         orgname = strdup (m->name);
  1268.         orgreal = m->realname;
  1269.         strcpy (m->name,argv[1]);
  1270.         m->realname = argv[2];
  1271.         updatedefaults (m, 2);
  1272.         strcpy (m->name, orgname);
  1273.         m->realname = orgreal;
  1274.         free (orgname);
  1275.     } else
  1276.         askrealname (m, 0);
  1277.     return 0;
  1278. }
  1279.  
  1280.  
  1281.  
  1282. int DiffUsers;
  1283.  
  1284. time_t
  1285. loguser(m)
  1286. struct mbx *m;
  1287. {
  1288.     register struct pu *pu;
  1289. #ifdef USERLOG
  1290.     FILE *Ufile;
  1291.     char buf[256];
  1292.     char *cp;
  1293.     int found=0;
  1294.     time_t t, laston = 0;
  1295.     int xpert = 0;
  1296. #endif
  1297.  
  1298.     time(&t);
  1299.     m->logontime = (long) t;
  1300.     if((pu = pu_lookup(m->name)) == NULLPU) {   /* not 'known' user */
  1301.         pu = (struct pu *)callocw(1,sizeof(struct pu));
  1302.         strcpy(pu->name,m->name);
  1303.         pu->next = Pu;
  1304.         Pu = pu;
  1305.         DiffUsers++;    /* A new guy */
  1306.     }
  1307. #ifdef notdef
  1308.     pu->family = m->family;
  1309. #endif
  1310.     pu->time = secclock();
  1311.     pu->number++;
  1312.  
  1313. #ifdef USERLOG
  1314.     /* Now get options from the userdefaults file, and add timestamp */
  1315.     if(!(m->sid&MBX_SID)) { /* only if not a bbs */
  1316.         sprintf(buf,"%s",UDefaults);
  1317.         if ((Ufile = fopen(buf,"r+")) == NULLFILE) {
  1318.             /* default file doesn't exist, create it */
  1319.             if((Ufile = fopen(buf,"w")) == NULLFILE)
  1320.                 return (time_t) -1;
  1321.             /* Add this user as first one,
  1322.              * default uses Area indication
  1323.              */
  1324.         m->home = strdup ("-");
  1325.  
  1326.             time(&t);
  1327.             sprintf(buf,"%s @%s () %lu M%d %c %c %c         C%c\n",
  1328.                     m->name,
  1329.             (m->home && strnicmp (m->home, Hostname, strlen(m->home)))
  1330.              ? m->home : "",t,m->morerows,
  1331.             (m->privs&IS_BBS) ? ' ' : 'A',
  1332.                     (m->sid&MBX_EXPERT) ? 'X' : ' ' ,
  1333.                     (m->sid&MBX_NRID) ? 'N' : ' ',
  1334.                     (m->family == AF_AX25) ? 'A' : \
  1335.                     ((m->family == AF_NETROM) ? 'N' : 'T'));
  1336.             fputs(buf,Ufile);
  1337.             fclose(Ufile);
  1338.             m->realname = NULLCHAR;
  1339.             if (!(m->privs&IS_BBS))
  1340.         m->sid |= MBX_AREA;
  1341.             if(Usenrid)
  1342.                 m->sid |= MBX_NRID;
  1343.             return laston;
  1344.         }
  1345.         /* Find user in the default file */
  1346.         while(!found) {
  1347.             if(fgets(buf,sizeof(buf),Ufile) == NULLCHAR)
  1348.                 break;
  1349.             if((cp=strchr(buf,' ')) != NULLCHAR)
  1350.                 *cp++ = '\0';
  1351.             if(!stricmp(m->name,buf)) {
  1352.                 /* found user, now scan the options used */
  1353.                 found = 1;
  1354.                 fclose(Ufile);
  1355.                 if (*cp == '@')        {
  1356.                     char *cp2;
  1357.             if((cp2=strchr(cp++,' ')) != NULLCHAR)    {
  1358.                 *cp2++ = '\0';
  1359.                 if (*cp)
  1360.                     m->home = strdup (cp);
  1361.                 cp = cp2;
  1362.             }
  1363.                 }
  1364.                 else
  1365.             m->home = strdup ("-");
  1366.         cp = skipwhite (cp);
  1367.         m->realname = NULLCHAR;
  1368.         if (*cp == '(')        {
  1369.             char *cp2;
  1370.             if((cp2=strchr(cp,')')) != NULLCHAR)    {
  1371.                 cp2++;
  1372.                 *cp2++ = '\0';
  1373.                 m->realname = strdup (cp);
  1374.                 cp = cp2;
  1375.             }
  1376.         }
  1377.         cp = skipwhite (cp);
  1378.                 laston = atol (cp);
  1379.                 while(*cp != ' ')    /* now skip the laston time */
  1380.                     cp++;
  1381.                 while(*cp != '\0') {
  1382.                     while(*cp == ' ')   /*skip blanks*/
  1383.                         cp++;
  1384.                     switch(*cp){
  1385.                         case 'C':
  1386.                             /* All options end BEFORE the CT/CN or CA */
  1387.                             *(cp+1) = '\0';
  1388.                             break;
  1389.                         case 'M':
  1390.                             cp++;
  1391.                             m->morerows = atoi(cp);
  1392.                             break;
  1393.                         case 'A':
  1394.                             m->sid |= MBX_AREA;
  1395.                             break;
  1396.                         case 'G':
  1397.                             m->sid |= MBX_GFX;
  1398.                             m->usecolor = 1;
  1399.                             break;
  1400.                         case 'X':
  1401.                             m->sid |= MBX_EXPERT;
  1402.                             xpert = 1;
  1403.                             break;
  1404.                         case 'N':
  1405.                             m->sid |= MBX_NRID;
  1406.                             break;
  1407.                         case 'R':
  1408.                             m->sid |= MBX_RDMOTD;
  1409.                             break;
  1410.                         case 'S':
  1411.                             m->sid |= MBX_STATS;
  1412.                             break;
  1413.                         case 'L':
  1414.                             m->sid |= MBX_TNOS;
  1415.                             break;
  1416.                     }
  1417.                     cp++;
  1418.                 }
  1419.             }
  1420.         } /* while(!found)*/
  1421.         if(found) {
  1422.             /* add the new timestamp to the defaults file */
  1423.             updatedefaults(m, 0);
  1424.             if(!xpert)
  1425.                 m->sid &= ~MBX_EXPERT;
  1426.             return laston;
  1427.         } else {
  1428.             /* a new one, add to the end (where we now should be!)*/
  1429.         m->home = strdup ("-");
  1430.             time(&t);
  1431.             sprintf(buf,"%s @%s () %lu M%d %c %c %c         C%c\n",
  1432.                     m->name,
  1433.             (m->home && strnicmp (m->home, Hostname, strlen(m->home)))
  1434.              ? m->home : "",t,m->morerows,
  1435.             (m->privs&IS_BBS) ? ' ' : 'A',
  1436.                     (m->sid & MBX_EXPERT) ? 'X' : ' ' ,
  1437.                     (Usenrid) ? 'N' : ' ' ,
  1438.                     (m->family == AF_AX25) ? 'A' : \
  1439.                     ((m->family == AF_NETROM) ? 'N' : 'T'));
  1440.             fputs(buf,Ufile);
  1441.             fclose(Ufile);
  1442.             m->realname = NULLCHAR;
  1443.         if (!(m->privs&IS_BBS))
  1444.         m->sid |= MBX_AREA;
  1445.             if(Usenrid)
  1446.                 m->sid |= MBX_NRID;
  1447.             return laston;
  1448.         }
  1449.     }/* if not bbs */
  1450. #ifdef notnow
  1451.     else if (findhome (m->name) == NULLCHAR)    {    /* if not in file, flag to add for HOME BBS info, only */
  1452.             m->home = strdup (m->name);
  1453.             m->update = 1;
  1454.     }
  1455. #endif
  1456. #endif /* USERLOG */
  1457.     return (time_t) -1;
  1458. }
  1459.  
  1460.  
  1461. /*List all past users of the mailbox */
  1462. static int
  1463. dombpast(argc,argv,p)
  1464. int argc;
  1465. char *argv[];
  1466. void *p;
  1467. {
  1468.  
  1469.     register struct pu *pu;
  1470.     int col = 0;
  1471.     int maxcount=10000;      /* Large enough :-) */
  1472.     int count=0;
  1473.  
  1474.     if(argc>1)
  1475.         maxcount = atoi(argv[1])-1;
  1476.  
  1477.     tputs("Past users:\nUser       Logins  Time since last   User       Logins  Time since last\n");
  1478.     for (pu=Pu;pu!=NULLPU;pu=pu->next) {
  1479.         if(col)
  1480.             tputs(" : ");
  1481.         tprintf("%-10s    %-4d    %12s",pu->name,pu->number,\
  1482.                 tformat(secclock() - pu->time));
  1483.         count++;
  1484.         if(count>maxcount)
  1485.             break;
  1486.         if(col) {
  1487.             col = 0;
  1488.             tputc('\n');
  1489.         } else
  1490.             col = 1;
  1491.     }
  1492.     if(col)
  1493.         tputc('\n');
  1494.     tputc('\n');
  1495.     return 0;
  1496. }
  1497.  
  1498. int
  1499. dombmailstats(argc,argv,p)
  1500. int argc;
  1501. char *argv[];
  1502. void *p;
  1503. {
  1504.     tprintf ("Mem: ");
  1505.     mbmemory ();
  1506.     tprintf("Total Logins: %d   (BBS: %d - CONF: %d - TUTOR: %d - INFO: %d - NEWS: %d)\nUp: %s\nUsers: %d\nCount: %d\n",
  1507.              Totallogins,BBSlogins,
  1508.              Conflogins,Tutorlogins[0],Tutorlogins[1],Tutorlogins[2],tformat(secclock()),BbsUsers,DiffUsers);
  1509.  
  1510. #ifdef MBFWD
  1511.     tprintf("Users sent: %d\nUsers read: %d\nReceived  : %d\nForwarded : %d\n",
  1512.             MbSent,MbRead,MbRecvd,MbForwarded);
  1513. #else
  1514.     tprintf("Users sent: %d\nUsers read: %d\nReceived  : %d\n",MbSent,MbRead,MbRecvd);
  1515. #endif
  1516.            if (ExpireActive)
  1517.               tprintf ("Expiration of public area%s %c%s%sin progress\n",
  1518.             ExpireArea ? "" : "s", ExpireArea ? '\'' : '\0',
  1519.             ExpireArea ? ExpireArea : "", ExpireArea ? "\' " : "");
  1520.     else if (ExpireLast)
  1521.         tprintf ("Last Expiration: %s", ptime(&ExpireLast));    
  1522.            dombmailfor (1, (char *) 0, (void *) 0);
  1523.     return 0;
  1524. }
  1525.  
  1526. #ifdef USERLOG
  1527. extern int DTranslate;                 /* do IP address to domain name translation */
  1528.  
  1529.  
  1530. /* Search for info on a certain user in the users.dat file */
  1531. int
  1532. dombuserinfo(argc,argv,p)
  1533. int argc;
  1534. char *argv[];
  1535. void *p;
  1536. {
  1537. FILE *Ufile;
  1538. char buf[MBXLINE];
  1539. int found = 0;
  1540. time_t t;
  1541. struct tm *lt;
  1542. char *cp, *cp2, *home = 0, *cp3;
  1543. struct mbx *m;
  1544. char *realname;
  1545. long addr;
  1546. int trans;
  1547.  
  1548.     m = (struct mbx *) p;
  1549.  
  1550.     if((Ufile = fopen(UDefaults,"r")) == NULLFILE) {
  1551.         tputs("Can't find user data\n");
  1552.         return 0;
  1553.     }
  1554.     while( !found && (fgets(buf,MBXLINE,Ufile) != NULLCHAR) ) {
  1555.         if((cp=strchr(buf,' ')) != NULLCHAR)
  1556.             *cp++ = '\0';
  1557.         if(!stricmp(buf,argv[1])) { /* Found it ! */
  1558.             home = Hostname;
  1559.             if((cp3=strchr(cp,' ')) != NULLCHAR)
  1560.                 *cp3++ = '\0';
  1561.         if (*cp == '@')    {
  1562.             cp++;
  1563.             if (*cp)
  1564.                 home = cp;
  1565.         }
  1566.  
  1567.         cp = skipwhite (cp3);
  1568.         realname = NULLCHAR;
  1569.         if (*cp == '(')        {
  1570.             if((cp2=strchr(cp,')')) != NULLCHAR)    {
  1571.                 cp2++;
  1572.                 *cp2++ = '\0';
  1573.                 realname = cp;
  1574.                 cp = cp2;
  1575.             }
  1576.         }
  1577.         cp = skipwhite (cp);
  1578.  
  1579.             t = atol(cp);
  1580.             lt = localtime(&t);
  1581.         cp2 = "TELNET";
  1582.             if((cp = strchr(cp,'C'))!=NULLCHAR) {
  1583.                 cp++;
  1584.                 /* How was the connection made ? */
  1585.                 switch(*cp) {
  1586.                     case 'A':
  1587.                         cp2 = "AX.25";
  1588.                         break;
  1589.                     case 'N':
  1590.                         cp2 = "NETROM";
  1591.                         break;
  1592.                 }
  1593.             }
  1594.  
  1595.         tprintf ("Information on %s %s\n", argv[1], (realname) ? realname : "");
  1596.             if (m == NULLMBX || m->stype == 'L')
  1597.         tprintf("%s last connected via %s on %s",argv[1],cp2,asctime(lt));
  1598.             tprintf ("%s's HOME BBS", argv[1]);
  1599.         if (*home == '-')
  1600.             tprintf (" is unknown!\n");
  1601.             else    {
  1602.                 strcpy (buf, home);
  1603.                 if ((cp = strchr (buf, '.')) != 0)
  1604.                     *cp = 0;
  1605.                 strupr (buf);
  1606.         tprintf (": '%s'\n", buf);
  1607.         }
  1608.             found = 1;
  1609.         }
  1610.     }
  1611.     fclose(Ufile);
  1612.     cp2 = wpage_exp (strdup (argv[1]), 1, 1);
  1613.     if (strchr(cp2, '.'))    {
  1614.             strupr (cp2);
  1615.         tprintf ("%s's WHITE PAGES: '%s'\n", argv[1], cp2);
  1616.     } else if (home && home == Hostname)    {
  1617.     tprintf ("%s's WHITE PAGES: '", argv[1]);
  1618.     sprintf (buf, "%s@", argv[1]);
  1619.         pax25(&buf[strlen(buf)],Mycall);
  1620.         if((cp = strchr(buf,'-')) != NULLCHAR)
  1621.             *cp = '\0'; /* remove SSID */
  1622.         strupr (buf);
  1623.         tputs (buf);
  1624.     sprintf(buf,"%s%s'\n", (Mbhaddress != NULLCHAR) ? "." : "",
  1625.         (Mbhaddress != NULLCHAR) ? Mbhaddress : "");
  1626.     strupr (buf);
  1627.         tputs (buf);
  1628.     }    
  1629.     free (cp2);
  1630.     if((addr = resolve(argv[1])) != 0){
  1631.     trans = DTranslate;             /* Save IP address translation state */
  1632.     DTranslate = 0;                 /* Force output to be numeric IP addr */
  1633.     tprintf("%s's TCP/IP ADDRESS: %s\n",argv[1], inet_ntoa(addr));
  1634.     DTranslate = trans;             /* Restore original state */
  1635.     }
  1636.  
  1637.     if(!found)
  1638.         tprintf("No local data found for %s\n",argv[1]);
  1639.     return 0;
  1640. }
  1641.  
  1642. #endif
  1643.  
  1644. int
  1645. dombusers(argc,argv,p)
  1646. int argc;
  1647. char *argv[];
  1648. void *p;
  1649. {
  1650.     register struct mbx *m,*caller;
  1651.     int i, len;
  1652.     char *cp, *cp1, fsocket[MAXSOCKSIZE];
  1653.     char upl[40], down[40];
  1654.  
  1655.     struct usock *up, *up1;
  1656.     int s;
  1657.     time_t elapsedtime;
  1658.  
  1659. #ifdef NETROM
  1660.     struct nrroute_tab *np;
  1661.     char temp[AXBUF], *cp2, *cp3;
  1662. #endif
  1663.  
  1664.     caller = (struct mbx *) p;
  1665.  
  1666.     if (caller->stype == 'H' || caller->stype == 'P' || caller->stype == 'T' || caller->stype == 'A')
  1667.         return dodelmsg(argc, argv, p);
  1668.  
  1669.     if(caller->stype == 'S')
  1670.         return dombmailstats(argc,argv,p);
  1671.  
  1672.     if(caller->stype == 'F' && (caller->privs & SYSOP_CMD))    {
  1673.         if (argc < 3)    {
  1674.             tputs ("Syntax: MF msg# BBSname\n");
  1675.             return 0;
  1676.         }
  1677.     s = atoi (argv[1]);
  1678.         if (!s || (caller->nmsgs < s))
  1679.             tputs ("Message number out of range\n");
  1680.         else
  1681.             updateFwd (argv[2], caller->area, caller->mbox[s].bid);
  1682.         return 0;
  1683.     }
  1684.  
  1685.     if(caller->stype == 'K' && (caller->privs & SYSOP_CMD))
  1686.         return dombkick(argc,argv,p);
  1687.  
  1688.     if(caller->stype == 'X' && (caller->privs & SYSOP_CMD))    {
  1689.         Expiretick(NULL);
  1690.         return 0;
  1691.     }
  1692.     if((caller->stype == 'W' || caller->stype == 'M' || caller->stype == 'C') && (caller->privs & SYSOP_CMD))
  1693.         return dombmovemail(argc,argv,p);
  1694.     if (caller->stype == 'R')        {
  1695.         FILE *fp;
  1696.         char *from, *to, *file, msgtype;
  1697.     if (!(caller->privs & SYSOP_CMD))    {
  1698.             tputs ("Only available to SYSOPs, sorry!\n");
  1699.             return 0;
  1700.         }
  1701.         if (argc < 4 || argc > 5)    {
  1702.             tputs ("Syntax: MR type filename toname [fromname]\n");
  1703.             return 0;
  1704.         }
  1705.     if (!(file = permtest(caller->path, caller->privs,argv[2],RETR_CMD, NULLCHAR, 0)))
  1706.         return 0;
  1707.         
  1708.         if ((fp = fopen (file, READ_TEXT)) != NULLFILE)    {
  1709.             from = host_or_wpage_exp (strdup ((argc == 5) ? argv[4] : caller->name), 1, 0);
  1710.             msgtype = toupper(argv[1][0]);
  1711.             if (msgtype != 'B')
  1712.             to = host_or_wpage_exp (strdup (argv[3]), 1, 0);
  1713.             tputs ("Subject:\n");
  1714.             if (mbxrecvline(caller) != -1)    {
  1715.                 rdaemon (fp, from, to, caller->line, msgtype, 0);
  1716.                 tputs ("Message queued\n");
  1717.             smtptick(NULL);        /* wake up SMTP to send mail */
  1718.         }
  1719.             fclose (fp);
  1720.             free (from);
  1721.             free (to);
  1722.         } else
  1723.             tprintf ("Unable to open file '%s'\n", file);
  1724.         free(file);
  1725.         return 0;
  1726.     }
  1727.  
  1728.     if(caller->stype == 'L')
  1729. #ifdef USERLOG
  1730.         if((argc > 1) && (atoi(argv[1]) == 0))
  1731.             return dombuserinfo(argc,argv,p);
  1732.         else
  1733. #endif
  1734.             return dombpast(argc,argv,p);
  1735.  
  1736.     tputs("Users:\n");
  1737.  
  1738.     for(i = 0; i < NUMMBX; i++) {
  1739.         if((m = Mbox[i]) != NULLMBX){
  1740.             len = MAXSOCKSIZE;
  1741.             getpeername(m->user,fsocket,&len);
  1742.             cp = strdup(psocket(fsocket));
  1743.  
  1744.             upl[0] = '\0';
  1745.             down[0] = '\0';
  1746.  
  1747.             switch(m->family) {        /* UPLINK */
  1748. #ifdef AX25
  1749.             case AF_AX25:
  1750.                    sprintf(upl,Uplink,cp);
  1751.                 break;
  1752. #endif
  1753. #ifdef NETROM
  1754.             case AF_NETROM:
  1755.                 if((cp1 = strchr(cp,' ')) != NULLCHAR)
  1756.                     *cp1 = '\0';
  1757.                 cp1 += 3;
  1758.                 setcall(temp,cp1);
  1759.                 np = find_nrroute(temp);
  1760.                 cp2 = strdup(np->alias);
  1761.                 if((cp3 = strchr(cp2,' ')) != NULLCHAR)
  1762.                     *cp3 = '\0';
  1763.             /*
  1764.                 if(*cp2 == '#' || *cp2 == '\0')
  1765.                     sprintf(upl,incircuit,"","",cp1,cp);
  1766.                 else
  1767.              */
  1768.              /* show correct user name when outgoing forward over netrom
  1769.               * problem caused by use of the '.C xxx' lines.
  1770.               */
  1771.                 if(m->state == MBX_TRYING || m->state == MBX_FORWARD)
  1772.                     sprintf(upl,incircuit,cp2,":",cp1,m->name);
  1773.                 else
  1774.                     sprintf(upl,incircuit,cp2,":",cp1,cp);
  1775.                 free(cp2);
  1776.                 break;
  1777. #endif
  1778.             case AF_INET:
  1779.                 if((cp1 = strchr(cp,':')) != NULLCHAR)
  1780.                     *cp1 = '\0';
  1781.                 sprintf(upl,Telnet,m->name,cp);
  1782.                 break;
  1783.             case AF_LOCAL:
  1784.                 sprintf(upl,Local,m->name,Hostname);
  1785.                 break;
  1786.             default:
  1787.                 strcpy(upl,"Connect");
  1788.                 break;
  1789.             }
  1790.             free(cp);
  1791.             if (m->state == MBX_TRYING)    /* forwarding session */
  1792.                 sprintf (upl, "Forwarding Daemon: %s", m->name);
  1793.             tprintf("%-36s",upl);
  1794.  
  1795.         /* Show their elapsed time on system - KO4KS */
  1796.             elapsedtime = 0;
  1797.         if (m->state != MBX_LOGIN)    {
  1798.                 time((time_t *)&elapsedtime);
  1799.                 elapsedtime -= m->logontime;
  1800.         }
  1801.         tprintf (" %10.10s", (m->state == MBX_TRYING) ? "" : tformat (elapsedtime));
  1802.         
  1803.             /* Now show what they are doing - WG7J */
  1804.             if(m->state != MBX_GATEWAY)
  1805.                 tputs("  -> ");
  1806.             switch(m->state){
  1807.             case MBX_GATEWAY:
  1808.                 for(s = SOCKBASE; s < Nusock + SOCKBASE; s++) {
  1809.                     if((up = itop(s)) == NULLUSOCK || s == m->user)
  1810.                         continue;
  1811.                     up1 = itop(m->user);
  1812.                     if(up->owner == up1->owner) {
  1813.                         getpeername(s,fsocket,&len);
  1814.                         cp = strdup(psocket(fsocket));
  1815.                         switch(up->type) {
  1816.                             case TYPE_TCP:
  1817. #ifdef notdef
  1818.                                 if((cp1 = strchr(cp,':')) != NULLCHAR)
  1819.                                     *cp1 = '\0';
  1820. #endif
  1821.                                 sprintf(down,Telnetdown,cp);
  1822.                                 break;
  1823. #ifdef AX25
  1824.                             case TYPE_AX25I:
  1825.                                 /*
  1826.                                 if((cp1 = strchr(cp,' ')) != NULLCHAR)
  1827.                                     *cp1 = '\0';
  1828.                                 */
  1829.                                 sprintf(down,Downlink,cp);
  1830.                                 break;
  1831. #endif
  1832. #ifdef NETROM
  1833.                             case TYPE_NETROML4:
  1834.                                 /*get rid of usercall*/
  1835.                                 if((cp1 = strchr(cp,' ')) != NULLCHAR)
  1836.                                     *cp1 = '\0';
  1837.                                 cp1 += 3;   /*get rid of ' @ '*/
  1838.                                 setcall(temp,cp1);      /*get node call*/
  1839.                                 np = find_nrroute(temp);/*find alias, if any*/
  1840.                                 cp2 = strdup(np->alias);
  1841.                                 if((cp3 = strchr(cp2,' ')) != NULLCHAR)
  1842.                                     *cp3 = '\0';
  1843.                                 /*
  1844.                                 memcpy(cp,m->call,AXALEN);
  1845.                                 cp[ALEN] ^= 0x1e;
  1846.                                 */
  1847.                                 /*
  1848.                                 if(*cp2 == '#' || *cp2 == '\0')
  1849.                                     sprintf(down,outcircuit,"","",cp1);
  1850.                                 else
  1851.                                 */
  1852.                                 sprintf(down,outcircuit,cp2,":",cp1);
  1853.                                 free(cp2);
  1854.                                 break;
  1855. #endif
  1856.                             case TYPE_LOCAL_STREAM:
  1857.                             case TYPE_LOCAL_DGRAM:
  1858.                                 sprintf(down,Local,m->name, Hostname);
  1859.                                 break;
  1860.                             default:
  1861.                                 strcpy(down,"Connect");
  1862.                                 break;
  1863.                         }
  1864.                         free(cp);
  1865.                         tprintf("<--> %s\n",down);
  1866.                         break;
  1867.                     }
  1868.                 }
  1869.                 break;
  1870.             case MBX_LOGIN:
  1871.                 tputs("Logging in\n");
  1872.                 break;
  1873.             case MBX_CMD:
  1874.                 tputs("Idle\n");
  1875.                 break;
  1876.             case MBX_SUBJ:
  1877.             case MBX_DATA:
  1878.                 tputs("Sending message\n");
  1879.                 break;
  1880.             case MBX_REVFWD:
  1881.                 tputs("Reverse Forwarding\n");
  1882.                 break;
  1883.             case MBX_TRYING:
  1884.                 tputs("Attempting Forward\n");
  1885.                 break;
  1886.             case MBX_FORWARD:
  1887.                 tputs("Forwarding\n");
  1888.                 break;
  1889.             case MBX_READ:
  1890.                 tputs("Reading message\n");
  1891.                 break;
  1892.             case MBX_UPLOAD:
  1893.                 tputs("Uploading file\n");
  1894.                 break;
  1895.             case MBX_DOWNLOAD:
  1896.                 tputs("Downloading file\n");
  1897.                 break;
  1898. #ifdef CONVERS
  1899.             case MBX_CONVERS:
  1900.                 tputs("Convers mode\n");
  1901.                 break;
  1902. #endif
  1903.             case MBX_TUTOR:
  1904.                 tputs("Being Tutored\n");
  1905.                 break;
  1906.             case MBX_CHAT:
  1907.                 tputs("Chatting with sysop\n");
  1908.                 break;
  1909.             case MBX_WHAT:
  1910.                 tputs("Listing files\n");
  1911.                 break;
  1912.         case MBX_XMODEM_RX:
  1913.         tputs("Xmodem Receiving\n");
  1914.         break;
  1915.         case MBX_XMODEM_TX:
  1916.         tputs("Xmodem Sending\n");
  1917.         break;
  1918.             }
  1919.             /* Only show callers with sysop-privs who is sysop-mode!
  1920.              * This prevents users from easily learning who's
  1921.              * got SYSOP privs
  1922.              */
  1923.             if(m->state == MBX_SYSOPTRY) {
  1924.                 if(caller->privs & SYSOP_CMD)
  1925.                     tputs("Attempting Sysop mode\n");
  1926.                 else
  1927.                     tputs("Idle\n");
  1928.             } else {
  1929.                 if(m->state == MBX_SYSOP) {
  1930.                     if(caller->privs & SYSOP_CMD)
  1931.                         tputs("Sysop mode\n");
  1932.                     else
  1933.                         tputs("Idle\n");
  1934.                 }
  1935.             }
  1936.         }
  1937.     }
  1938.     tputc('\n');
  1939.     return 0;
  1940. }
  1941.  
  1942. #ifdef TIPMAIL
  1943. #ifdef ALLSERV
  1944. static int
  1945. dotimeout(argc,argv,p)
  1946. int argc;
  1947. char *argv[];
  1948. void *p;
  1949. {
  1950.     return setuns(&Tiptimeout,"Tip connection timeout",argc,argv);
  1951. }
  1952. static int
  1953. dotipsecurity(argc,argv,p)
  1954. int argc;
  1955. char *argv[];
  1956. void *p;
  1957. {
  1958.     return setlong(&Mbtipperms,"Tip security permission (for anonymous)",argc,argv);
  1959. }
  1960. #endif
  1961. #endif
  1962.  
  1963. #ifdef MBFWD
  1964. static int
  1965. dombsubchannel(argc,argv,p)
  1966. int argc;
  1967. char *argv[];
  1968. void *p;
  1969. {
  1970. int netnum;
  1971. char buf[60], *cp;
  1972.  
  1973.     if (argc == 1)    {
  1974.         for (netnum = 0; netnum < NUMMBX; netnum++)
  1975.             tprintf ("Subchannel %2d: Maximum Fwds - %2d, Currently - %2d\n", netnum, (int) subchannels[netnum], (int) subchannelusage[netnum]);
  1976.         return 0;
  1977.     }
  1978.     if (argv[1][0] == '?')    {
  1979.         tputs ("Usage: mbox subchannel channel# [maxfwds]\n");
  1980.         return 0;
  1981.     }
  1982.     netnum = atoi (argv[1]);
  1983.     if (netnum > NUMMBX)    {
  1984.         tprintf ("Valid subchannel numbers are 0 through %d\n", NUMMBX);
  1985.         return 0;
  1986.     }
  1987.     sprintf (buf, "Maximum Forwarding Sessions on Subchannel %d", netnum);
  1988.     cp = argv[1];
  1989.     argv[1] = argv[2];
  1990.     argv[2] = cp;
  1991.     return setuns(&subchannels[netnum],buf,argc - 1,argv);
  1992. }
  1993.  
  1994. static int
  1995. dombtrace(argc,argv,p)
  1996. int argc;
  1997. char *argv[];
  1998. void *p;
  1999. {
  2000.     return setbool(&Mtrace,"Mailbox trace flag",argc,argv);
  2001. }
  2002. #endif
  2003.  
  2004. static int
  2005. dombsecure(argc,argv,p)
  2006. int argc;
  2007. char *argv[];
  2008. void *p;
  2009. {
  2010.     return setbool(&MBSecure,"Mailbox gateway secure flag",argc,argv);
  2011. }
  2012.  
  2013. #ifdef CALLBOOK
  2014. char *InetCallserver = NULLCHAR;
  2015. char *InetCallserverport = NULLCHAR;
  2016.  
  2017. int
  2018. doinetcallserver(argc,argv,p)
  2019. int argc;
  2020. char *argv[];
  2021. void *p;
  2022. {
  2023.     if(argc == 1) {
  2024.         if(InetCallserver != NULLCHAR) {
  2025.             tprintf("Server %s, on port %s\n",InetCallserver,InetCallserverport);
  2026.         } else
  2027.             tputs("Not set!\n");
  2028.         return 0;
  2029.     }
  2030.     if(argc == 2) {
  2031.         tputs("Usage: callserver <host> <port>\n");
  2032.         return 0;
  2033.     }
  2034.     /*Check validity of the parameters*/
  2035.     if(resolve(argv[1]) == (int32) 0) {
  2036.         tprintf(Badhost,argv[1]);
  2037.         return 0;
  2038.     }
  2039.     if(atoi(argv[2]) == (int) 0) {
  2040.         tprintf("Bad port %s\n",argv[2]);
  2041.         return 0;
  2042.     }
  2043.     if(InetCallserver != NULLCHAR) {
  2044.         free(InetCallserver);
  2045.         free(InetCallserverport);
  2046.     }
  2047.     InetCallserver = strdup(argv[1]);
  2048.     InetCallserverport = strdup(argv[2]);
  2049.     return 0;
  2050. }
  2051. #endif /* CALLBOOK */
  2052.  
  2053. char *cmd_line(argc, argv, stype)
  2054. int argc;
  2055. char *argv[];
  2056. char stype;
  2057. {
  2058.     static char line[MBXLINE+1];
  2059.     int i;
  2060.     char *cp;
  2061.  
  2062.  
  2063.     cp = line;
  2064.     sprintf(cp,"%s ",argv[0]);
  2065.     cp+=strlen(cp);
  2066.     if(stype != ' ') {
  2067.         --cp;
  2068.         if (islower(*line))
  2069.             tolower(stype);
  2070.         sprintf(cp,"%c ",stype);
  2071.         cp += 2;
  2072.     }
  2073.     for(i=1;i<argc;i++) {
  2074.         sprintf(cp,"%s ",argv[i]);
  2075.         cp += strlen(cp);
  2076.     }
  2077.     return line;
  2078. }
  2079.  
  2080. #endif /* MAILBOX */
  2081.